﻿using System;
using System.Collections.Generic;
using System.Text;

namespace daSyntaxAnalyser.SyntaxTree
{
    using daBase.Objects;

    /// <summary>
    /// Блок объявлений переменных в блоке case, расположенном внутри записи
    /// </summary>
    public class RecordCaseBlockElement : SyntaxTreeElement
    {
        private List<ExpressionElement> _params;
        private List<VarDeclarationElement> vars;

        /// <summary>
        /// Параметры блока
        /// </summary>
        public List<ExpressionElement> Params { get { return _params; } set { _params = value; } }

        /// <summary>
        /// Список объявленных переменных
        /// </summary>
        public List<VarDeclarationElement> Vars { get { return vars; } set { vars = value; } }

        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="StartInfo">информация о позиции элемента в коде</param>
        /// <param name="Params">параметры блока</param>
        /// <param name="Vars">список объявленных переменных</param>
        /// <param name="Comments">комментарии, относящиеся к элементу</param>
        public RecordCaseBlockElement(TokenInfo StartInfo, List<ExpressionElement> Params, List<VarDeclarationElement> Vars, List<TokenInfo> Comments)
            : base(StartInfo, Comments)
        {
            _params = Params;
            vars = Vars;
        }

        /// <summary>
        /// Представление элемента в строковом формате
        /// </summary>
        /// <returns>строковое представление элемента</returns>
        public override string ToString()
        {
            return string.Format("{0} : (\r\n{1}\r\n);", _params.Join(", "), Tabulate(vars.Join("\r\n")));
        }

        /// <summary>
        /// Создание типизированного энумератора
        /// </summary>
        /// <returns>энумератор</returns>
        protected override IEnumerator<ISyntaxTreeElement> CreateEnumerator()
        {
            foreach (ExpressionElement expr in _params)
                yield return expr;
            foreach (FunctionVarDeclarationElement var in vars)
                yield return var;
        }
    }
}
